package org.jerrymouse.jsa4j.db.kv;

import java.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 索引，这个数据库提供基本的索引功能。
 * 
 * @author yankai
 * 
 */
public class Indexer {
	private Repository repository;
	private JsonUtil<Set> jsonUtil;

	/**
	 * 构造方法
	 * 
	 * @param prefix
	 *            。Key的前缀，相当于给数据一个“类别”的概念
	 * @param db
	 *            。数据库底层
	 */
	public Indexer(String prefix, DB db) {
		this(new Repository(prefix, db));
	}

	/**
	 * 构造方法
	 * 
	 * @param 已有的仓库
	 */
	public Indexer(Repository repository) {
		this.repository = repository;
		jsonUtil = new JsonUtil<Set>();
	}

	/**
	 * 生成索引
	 * 
	 * @param index
	 *            索引键
	 * @param content
	 *            索引值
	 */
	public void makeIndexs(String key, List<String> contents) {
		for (String content : contents) {
			makeIndex(key, content);
		}
	}

	/**
	 * 生成索引
	 * 
	 * @param key
	 *            索引键
	 * @param content
	 *            索引值
	 */
	public void makeIndex(String key, String content) {
		Set<String> keys = getKey(content);
		if (keys == null)
			keys = new HashSet<String>();
		keys.add(key);
		putIndexes(content, keys);
	}

	/**
	 * 删除索引
	 * 
	 * @param key
	 *            索引键
	 * @param content
	 *            索引值
	 */
	public void deleteIndex(String key, String content) {
		Set<String> keys = getKey(content);
		if (keys != null) {
			keys.remove(keys);
			putIndexes(content, keys);
		}
	}

	/**
	 * 获取索引
	 * 
	 * @param content
	 *            索引键
	 */
	public Set<String> getKey(String content) {
		String json = repository.get(content);
		if (json != null) {
			Set<String> list = jsonUtil.toBean(json, Set.class);
			return list;
		}
		return null;
	}

	/**
	 * 更新索引
	 * 
	 * @param content
	 *            索引键
	 * @param content
	 *            索引值
	 */
	public void putIndexes(String content, Set<String> keys) {
		if (content == null)
			return;
		String json = jsonUtil.toJson(keys);
		repository.put(content, json);
	}
}
